﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TicketsPhone.Domain.Entities;
using TicketsPhone.Web.Models;

namespace TicketsPhone.Web.Controllers
{
   /// <summary>
   /// Clase que contiene las operaciones base par el resto de controles
   /// </summary>
    public class BaseController : Controller
    {
        protected override void Initialize(System.Web.Routing.RequestContext requestContext)
        {
            base.Initialize(requestContext);
            CargarModulo();
        }

        /// <summary>
        /// Módulo actual del usuario
        /// </summary>
        public string Modulo { get; set; }

        /// <summary>
        /// Acción en la que se encuentra el usuario
        /// </summary>
        public TipoPermiso Accion { get; set; }


        /// <summary>
        /// Valida si puede cargar o no el modulo en el permiso que desean.
        /// </summary>
        private void CargarModulo()
        {
            this.Modulo = this.ControllerContext.RouteData.Values["controller"].ToString();

            try
            {
                this.Accion = (TipoPermiso)Enum.Parse(typeof(TipoPermiso), this.ControllerContext.RouteData.Values["action"].ToString());
                if (!SesionModel.TienePermiso(this.Modulo, this.Accion))
                {
                    this.Response.Redirect("/Home/Modulos");
                }
            }
            catch (Exception e)
            {
                //Valida que la accion que llega este en el listado de acciones adicionales, normalmente Ajax
                if (!System.Configuration.ConfigurationManager.AppSettings["excepcionesAccion"].Split(new char[] { '|' }).Contains(this.ControllerContext.RouteData.Values["action"].ToString()))
                {
                    this.Response.Redirect("/Home/Modulos");
                }
            }
        }


        TicketsPhone.Domain.Concrete.LogTransaccionRepositorio _log = new Domain.Concrete.LogTransaccionRepositorio();
        /// <summary>
        /// Captura las principales caracteristicas para guardar el log de transacciones dependiendo del control y del modelo actual
        /// </summary>
        /// <param name="tipoTransaccion">Edicion, eliminacion, creacion</param>
        /// <param name="id">id del objeto actualizado</param>
        /// <param name="model">Modelo de datos que se desea actualizar</param>
        protected void GuardarLogTransaccion(TicketsPhone.Domain.Access.TipoTransaccion tipoTransaccion, object model)
        { 
            LogTransaccion log = new LogTransaccion();
            log.IdUsuario = SesionModel.IdUsuario;
            log.Modulo = this.Modulo;
            log.Objeto = model;
            log.Fecha = DateTime.Now;
            log.Accion = tipoTransaccion;
            _log.GuardarLog(log);
        }
    }
}